const express = require('express');
const cors = require('cors');
const axios = require('axios');
const app = express();
const port = 3003;

/**
 * @fileoverview 讯飞星火大模型API代理服务器
 * -------------------------------------------------
 * 主要职责：
 * 1.  **隐藏API密钥**：将API Key、Secret等敏感信息保留在后端，避免暴露给前端。
 * 2.  **处理API认证**：根据讯飞开放平台的Bearer Token认证方式，在请求头中添加Authorization。
 * 3.  **解决跨域问题**：作为中间层，解决前端直接调用API时产生的CORS跨域问题。
 * 4.  **转发流式响应**：支持SSE（Server-Sent Events），将讯飞API的流式响应实时转发给前端。
 */

// 讯飞API配置信息
const XUNFEI_CONFIG = {
  apiKey: '9bf315f669cd77f7cc91a023c0a36f8b',
  apiSecret: 'M2FlNmIzMmRmYzdmYjFjOTU3YzQ4ZjA4',
  appId: '290f4fa9',
  apiPassword: 'KptIXEcXrlyeBbfmDPli:fFiDQMUDURMhwcVnoDLC', // 用于Bearer Token认证
  apiUrl: 'https://spark-api-open.xf-yun.com/v1/chat/completions' // 讯飞官方API地址
};

// --- 中间件设置 ---
// 1. 启用CORS，允许所有来源的跨域请求
app.use(cors());
// 2. 解析JSON格式的请求体
app.use(express.json());

/**
 * 健康检查端点
 * @description 用于检查代理服务器是否正常运行
 */
app.get('/health', (req, res) => {
  res.json({ status: 'ok', service: 'xunfei-proxy' });
});

/**
 * 代理讯飞聊天API的核心端点
 * @route POST /api/xunfei/chat
 */
app.post('/api/xunfei/chat', async (req, res) => {
  console.log('接收到聊天请求:', {
    model: req.body.model,
    messagesCount: req.body.messages?.length,
    stream: req.body.stream
  });

  try {
    const { messages, stream = true } = req.body;

    // 准备发送给讯飞API的请求数据
    const requestData = {
      model: '4.0Ultra', // 指定使用的模型
      messages: messages,
      stream: stream,
      temperature: 0.7,   // 控制生成文本的随机性
      max_tokens: 2048    // 最大生成token数
    };

    // --- 根据是否流式请求，进行不同处理 ---
    if (!stream) {
      // 1. 非流式响应处理
      const response = await axios.post(XUNFEI_CONFIG.apiUrl, requestData, {
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${XUNFEI_CONFIG.apiPassword}` // 使用APIPassword作为Bearer Token
        }
      });
      
      // 直接将讯飞返回的JSON数据转发给前端
      res.json(response.data);
    } else {
      // 2. 流式响应处理 (SSE)
      // 设置SSE响应头
      res.setHeader('Content-Type', 'text/event-stream');
      res.setHeader('Cache-Control', 'no-cache');
      res.setHeader('Connection', 'keep-alive');
      res.setHeader('Access-Control-Allow-Origin', '*');
      res.setHeader('X-Accel-Buffering', 'no'); // 关闭Nginx等反向代理的缓冲

      // 使用axios发起流式请求
      const response = await axios({
        method: 'post',
        url: XUNFEI_CONFIG.apiUrl,
        data: requestData,
        headers: {
          'Content-Type': 'application/json',
          'Authorization': `Bearer ${XUNFEI_CONFIG.apiPassword}`,
          'Accept': 'text/event-stream' // 明确告知服务器期望接收SSE
        },
        responseType: 'stream' // 关键：设置响应类型为流
      });

      // 将从讯飞API收到的数据流，实时转发给前端客户端
      response.data.on('data', (chunk) => {
        const chunkStr = chunk.toString();
        // console.log('收到响应chunk:', chunkStr.substring(0, 100));
        res.write(chunkStr); // 将数据块写入响应流
      });

      // 监听流结束事件
      response.data.on('end', () => {
        console.log('流式响应结束');
        res.end(); // 关闭响应
      });

      // 监听流错误事件
      response.data.on('error', (error) => {
        console.error('流式响应错误:', error);
        res.write(`data: {"error": "${error.message}"}\n\n`);
        res.end();
      });

      // 处理客户端断开连接的情况
      req.on('close', () => {
        console.log('客户端断开连接');
        response.data.destroy(); // 销毁从讯飞获取的流，节省资源
      });
    }
  } catch (error) {
    // 统一错误处理
    console.error('API调用失败:', error.response?.data || error.message);
    
    // 确保在没有发送任何响应头的情况下发送错误信息
    if (!res.headersSent) {
      res.status(error.response?.status || 500).json({
        error: error.response?.data?.error || "Internal Server Error",
        message: '调用讯f'
      });
    }
  }
});

/**
 * 启动Express服务器
 */
app.listen(port, () => {
  console.log(`讯飞API代理服务器运行在 http://localhost:${port}`);
  console.log(`API端点: POST http://localhost:${port}/api/xunfei/chat`);
});

/**
 * 全局异常捕获
 * @description 防止因未捕获的异常导致服务器崩溃
 */
process.on('uncaughtException', (err) => {
  console.error('未捕获的异常:', err);
});

process.on('unhandledRejection', (err) => {
  console.error('未处理的Promise拒绝:', err);
});
